﻿Imports PTIC_Util

''' <summary>
''' Représente une table de la base de données SAS
''' </summary>
''' <remarks></remarks>
<Serializable()> Public Class TableBDD_SAS
    Inherits tableBDD

    Protected _nomLibrairie As String

#Region "Constructeur"

    ''' <summary>
    ''' Constructeur (les caractéristiques physiques étant inconnues)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(ByVal nomTraitement As String, _
                   ByVal nomLibrairieSAS As String, _
                   Optional ByVal initialiseurTable As initialiseurTableBDD = Nothing, _
                   Optional ByVal univers As IUniversBDD = Nothing)

        MyBase.New(nomTraitement, _
                   initialiseurTable, _
                   univers)
        _nomLibrairie = nomLibrairieSAS
        If Not univers Is Nothing Then
            Connection = univers.Connection.Connection()
        End If

    End Sub

    ''' <summary>
    ''' Constructeur
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(ByVal nomTraitement As String, _
                   ByVal nomFichier As Cla_NomFichier, _
                   ByVal connection As OleDb.OleDbConnection, _
                   ByVal nomLibrairie As String, _
                   Optional ByVal DataSet As DataSet = Nothing)

        MyBase.New(nomTraitement, nomFichier, typeBase.SAS, , DataSet)

        'Initialisation de la connection : technique du Workspace
        Me.Connection = connection
        Me._nomLibrairie = nomLibrairie
        ''''Me._connection = SAS_initWorkspaceIOMconnection(_nomFichier)

        'Initialisation de la liste des tables disponibles
        MAJTablesDispoBDD()

        'Initialisation du nom de la table à extraire (induite, dans le cas du support SAS, par le nom
        'complet du fichier)
        NomTableDansBDD = nomFichier.NomSansExt

    End Sub

#End Region

#Region "Traitements des évènements Changement Nom de Base de Données  / Nom de Table"

    Protected Sub onNomTableBDDChanging(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String)) Handles Me.NomTableDansBDDChanging
        e.NewValue = _nomLibrairie & "." & e.NewValue
    End Sub
    Protected Sub onNomTableDansBDDChanged(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String)) Handles Me.NomTableDansBDDChanged
        invalideAll()
        If e.NewValue <> "libenc.libenc." Then
            MAJMetaDonnees()
            MAJListesChampsFromMetaDonnees()
            MAJStats()
        Else
            TableMetaDonnees = Nothing
            ListeChampsEntree = Nothing
            StatsTable.NbLignes = 0
            StatsTable.NbColonnes = 0
        End If
    End Sub
    Protected Sub onNomCompletFichierChanged(ByVal sender As Object, ByVal e As PropertyChangeEventArgs(Of String)) Handles Me.FichierBDD_NomCompletChanged
        invalideAll()
        MAJTablesDispoBDD()
    End Sub

#End Region

#Region "Méthodes de classe protégées"

    ''' <summary>
    ''' Mise à jour de la table contenant les méta-données de la table en entrée (noms des colonnes / types / formats)
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overrides Sub MAJMetaDonnees()
        'Crétion d'une table qui contient :
        '   - une ligne par champs de la table d'encours
        '   - les colonnes : nom du champs / type du champs / longueur du champs / format du champs

        Dim da1 As OleDb.OleDbDataAdapter, result As DataTable
        Dim schemaTbleFromFillSchema As New DataTable()
        Dim schemaTbleFromGetSchema As New DataTable()

        Try

            Connection.Open()

            'Récupération des caractéristiques des colonnes à l'aide de la méthode fillSchema
            da1 = New OleDb.OleDbDataAdapter("SELECT * FROM " & NomTableDansBDD & ";", Connection)
            da1.FillSchema(schemaTbleFromFillSchema, SchemaType.Source)

            'Récupération des caractéristiques des colonnes à l'aide de la méthode getSchema
            '(ici, les data_type sont codés)
            schemaTbleFromGetSchema = Connection.GetSchema("Columns", New String() {Nothing, Nothing, NomTableDansBDD, Nothing})
            'schemaTbleFromGetSchema.TableName = "SchemaColonnesEncours"

            Connection.Close()

            'A partir des deux tables récupérées ci-dessus, alimentation du schema final

            result = New DataTable("MetaDonneesTbleAExtraire")
            result.Columns.Add("COLUMN_NAME", GetType(System.String))
            result.Columns.Add("DATA_TYPE_FULLNAME", GetType(System.String))
            result.Columns.Add("COLUMN_LENGTH", GetType(System.Int32))
            result.Columns.Add("FORMAT_NAME", GetType(System.String))

            For Each c As DataColumn In schemaTbleFromFillSchema.Columns
                'Rechercher le nom du format dans la deuxième base
                For Each r As DataRow In schemaTbleFromGetSchema.Rows
                    If r("COLUMN_NAME") = c.ColumnName Then
                        If Not IsDBNull(r("FORMAT_NAME")) Then
                            result.Rows.Add(c.ColumnName, c.DataType.FullName, c.MaxLength, typeSAS(r("FORMAT_NAME")))
                        Else
                            result.Rows.Add(c.ColumnName, c.DataType.FullName, c.MaxLength, c.DataType.FullName)
                        End If
                    End If
                Next
            Next

            TableMetaDonnees = result

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    ''' <summary>
    ''' Mise à jour de la liste des tables disponibles dans la base de données
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overrides Sub MAJTablesDispoBDD()
        Dim listTablesASupprimer As New List(Of String)
        For Each Tble In ListTablesDispoBDD
            listTablesASupprimer.Add(Tble)
        Next
        If FichierBDD.Ext <> "sas7bdat" Then
            FichierBDD.NomComplet = ""
            'MsgBox("Vous devez sélectionner un fichier au format SAS (.sas7bdat)")
        End If
        If FichierBDD.NomComplet <> "" Then
            ListTablesDispoBDD.Add(FichierBDD.NomSansExt)
            NomTableDansBDD = FichierBDD.NomSansExt
        End If
        For Each l In listTablesASupprimer
            ListTablesDispoBDD.Remove(l)
        Next
    End Sub

#End Region

#Region "Méthode de classe privée pour la conversion des formats d'affichage"
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Private Function typeSAS(ByVal formatAff As String) As String
        Dim result As String = ""
        Select Case formatAff
            Case "DDMMYYS"
                result = "System.DateTime"
            Case "$"
                result = "System.String"
            Case "$CHAR"
                result = "System.String"
            Case "BEST"
                result = "System.Double"
            Case "F"
                result = "System.Double"
        End Select
        If result = "" Then
            MsgBox("Le format d'affichage SAS " & formatAff & " n'est pas reconnu")
        End If
        Return (result)
    End Function
#End Region

End Class
